﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.IO;
using System.Runtime.Serialization;
using System.Collections;
using System.Xml.Serialization;
using System.Security.Cryptography;
using System.Xml.Xsl;

namespace ВУИ
{
    public partial class grf : Form
    {
        public grf(Form1 main)
        {
            InitializeComponent();
            List<Global> g = new List<Global>();
            foreach (Patient p in main.lPatient)
            {
                int d = (p.Statement_date - p.Date_of_birth).Days;
                int m = 0;
                int y = 0;
                int n = 0;
                while (d > 365)
                {
                    d -= 365;
                    y++;
                }
                while (d > 30)
                {
                    d -= 30;
                    m++;
                }
                if ((y < 1) & (m >= 1))
                    while (d > 7)
                    {
                        d -= 7;
                        n++;
                    }
                if ((m >= 1) & (n == 4))
                {
                    m++;
                    n = 0;
                }
                string s = "";
                if (y > 0)
                {
                    s = Convert.ToString(y) + "год(лет) ";
                    if (m > 0) s += Convert.ToString(m) + "месяц(а)";
                }
                else
                {
                    if (m >= 1)
                    {
                        s = Convert.ToString(m) + "месяц(а) ";
                        if (n > 0) s += Convert.ToString(n) + "недели";
                    }
                    else
                    {
                        s = Convert.ToString(d) + "дней(я) ";
                    }
                }
                Global t = new Global();
                t.ФИО = p.This.Surname + " " + p.This.Name + " " + p.This.Patronymic;
                t.Дата_рождения = p.Date_of_birth;
                t.Возрост_на_момент_постановки = s;
                float sum = 0;
                if (p.Epidenamnez != null)
                {
                    foreach (EpiAtt e in main.lEpiAtt)
                        if (p.Epidenamnez.Att.IndexOf(e.Номер) >= 0) sum += e.Значние;
                    if (sum <= 12)
                        t.Заключение_по_эпиданамнезу = "Диагноз ВУИ маловероятен";
                    if ((sum <= 20) & (sum > 12))
                        t.Заключение_по_эпиданамнезу = "Диагноз ВУИ сомнителен";
                    if (sum > 21)
                        t.Заключение_по_эпиданамнезу = "Вероятность ВУИ очень велика";

                    if (p.Epidenamnez.Scrining != null)
                    {
                        t.torch = new List<ReportScrin>();

                        foreach (Scrin e in p.Epidenamnez.Scrining)
                        {
                            ReportScrin r1 = new ReportScrin();
                            r1.Дата = e.date;
                            r1.Серологические_иледования = "IgG";
                            r1.ВПГ = e.data[0];
                            r1.ЦМВ = e.data[1];
                            r1.Токсопл = e.data[2];
                            r1.Хламидии = e.data[3];
                            t.torch.Add(r1);
                            ReportScrin r2 = new ReportScrin();
                            r2.Дата = e.date;
                            r2.Серологические_иледования = "IgM";
                            r2.ВПГ = e.data[4];
                            r2.ЦМВ = e.data[5];
                            r2.Токсопл = e.data[6];
                            r2.Хламидии = e.data[7];
                            t.torch.Add(r2);
                            ReportScrin r6 = new ReportScrin();
                            r6.Дата = e.date;
                            r6.Серологические_иледования = "ИА";
                            r6.ВПГ = e.data[8];
                            r6.ЦМВ = e.data[9];
                            r6.Токсопл = e.data[10];
                            r6.Хламидии = e.data[11];
                            t.torch.Add(r6);
                        }
                    }
                }
                if (p.Diagnoz != null)
                {
                    t.МКБ = p.Diagnoz.mkb;
                    string st = "";
                    foreach (int i in p.Diagnoz.organ)
                        s += " " + main.lOrgan[i].name + ",";
                    if (p.Diagnoz.alterOrgan != "") s += " " + p.Diagnoz.alterEtiolog;
                    st.TrimEnd(',');
                    t.Пораженные_органы = st;
                    t.Этиологически_диагноз = new List<ReportEdpidemcs>();
                    foreach (etiologAtt e in main.lEtiAtt)
                    {
                        ReportEdpidemcs r1 = new ReportEdpidemcs();
                        r1.Этиолог_диагноз_признак = e.name;
                        r1.Номер = 1;
                        if (p.Diagnoz.etiolog.IndexOf(e.id) >= 0)
                        {
                            r1.Да = "+";
                            r1.Нет = "";

                        }
                        else
                        {
                            r1.Да = "";
                            r1.Нет = "+";
                        }
                        t.Этиологически_диагноз.Add(r1);

                    }
                    t.Диагноз_другое = p.Diagnoz.alterEtiolog;
                }
                if (p.Labis != null)
                {
                    if (p.Labis.oak != null)
                    {
                        t.ОАК = new List<string>();

                        foreach (OAK o in p.Labis.oak)
                        {
                            string str = "";
                            str = o.Дата.ToShortDateString() + " ";
                            d = (o.Дата - p.Date_of_birth).Days;
                            m = 0;
                            y = 0;
                            n = 0;
                            while (d > 365)
                            {
                                d -= 365;
                                y++;
                            }
                            while (d > 30)
                            {
                                d -= 30;
                                m++;
                            }
                            if ((y < 1) & (m >= 1))
                                while (d > 7)
                                {
                                    d -= 7;
                                    n++;
                                }
                            if ((m >= 1) & (n == 4))
                            {
                                m++;
                                n = 0;
                            }





                            int k = -1;
                            if (main.lON.Count > 0)
                                if (sum <= main.lON[0].Месяц) k = 0;

                            for (int i = 1; i < main.lON.Count; i++)
                            {
                                if ((sum > main.lON[i - 1].Месяц) & (main.lON[0].Месяц <= main.lON[i].Месяц)) k = i;
                            }
                            if (k >= 0)
                            {
                                if (o.Лейкоциты * 1000 < main.lON[k].Лекоциты_Низ) str += "Лейкопения; ";
                                if (o.Лейкоциты * 1000 > main.lON[k].Лекоциты_Верх) str += "Лейкоцитоз; ";
                                if ((o.Лейкоциты * 10 * o.НФ) < main.lON[k].НФ_Низ) str += "Нейтропения; ";
                                if ((o.НФ * o.Лейкоциты * 10) > main.lON[k].НФ_Верх) str += "Нейтрофилез; ";
                                if ((o.Моноциты * o.Лейкоциты * 10) > main.lON[k].Моноциты_Верх) str += "Моноцитоз; ";


                            }

                            t.ОАК.Add(str);
                        }
                    }
                    if (p.Labis.im != null)
                    {
                        t.Ig = new List<string>();
                        foreach (Imuno o in p.Labis.im)
                        {
                            string str = "";
                            str = o.Дата.ToShortDateString() + " ";
                            d = (o.Дата - p.Date_of_birth).Days;
                            m = 0;
                            y = 0;
                            n = 0;
                            while (d > 365)
                            {
                                d -= 365;
                                y++;
                            }
                            while (d > 30)
                            {
                                d -= 30;
                                m++;
                            }
                            if ((y < 1) & (m >= 1))
                                while (d > 7)
                                {
                                    d -= 7;
                                    n++;
                                }
                            if ((m >= 1) & (n == 4))
                            {
                                m++;
                                n = 0;
                            }





                            sum = y * 12 + m;
                            int k = -1;
                            if (main.lON.Count > 0)
                                if (sum <= main.lON[0].Месяц) k = 0;

                            for (int i = 1; i < main.lON.Count; i++)
                            {
                                if ((sum > main.lON[i - 1].Месяц) & (main.lON[0].Месяц <= main.lON[i].Месяц)) k = i;
                            }
                            if (k >= 0)
                            {
                                if (o.IgA < main.lON[k].IgA_Низ) str += "Дифицит имуноглабулинов класса А; ";
                                if (o.IgA > main.lON[k].IgA_Верх) str += "Избыток имуноглабулинов класса А; ";
                                if (o.IgG < main.lON[k].IgG_Низ) str += "Дифицит имуноглабулинов класса G; ";
                                if (o.IgG > main.lON[k].IgG_Верх) str += "Избыток имуноглабулинов класса G; ";
                                if (o.IgM < main.lON[k].IgM_Низ) str += "Дифицит имуноглабулинов класса M; ";
                                if (o.IgM > main.lON[k].IgM_Верх) str += "Избыток имуноглабулинов класса M; ";

                            }

                            t.Ig.Add(str);
                        }
                    }
                    if (p.Labis.so != null)
                    {
                        t.Серологические_иследования = new List<ReportScrin>();
                        foreach (seroocc e in p.Labis.so)
                        {

                            d = (e.date - p.Date_of_birth).Days;
                            m = 0;
                            y = 0;
                            n = 0;
                            while (d > 365)
                            {
                                d -= 365;
                                y++;
                            }
                            while (d > 30)
                            {
                                d -= 30;
                                m++;
                            }
                            if ((y < 1) & (m >= 1))
                                while (d > 7)
                                {
                                    d -= 7;
                                    n++;
                                }
                            if ((m >= 1) & (n == 4))
                            {
                                m++;
                                n = 0;
                            }
                            s = "";
                            if (y > 0)
                            {
                                s = Convert.ToString(y) + "год(лет) ";
                                if (m > 0) s += Convert.ToString(m) + "месяц(а)";
                            }
                            else
                            {
                                if (m >= 1)
                                {
                                    s = Convert.ToString(m) + "месяц(а) ";
                                    if (n > 0) s += Convert.ToString(n) + "недели";
                                }
                                else
                                {
                                    s = Convert.ToString(d) + "дней(я) ";
                                }
                            }

                            ReportScrin r1 = new ReportScrin();
                            r1.Возрост = s;
                            r1.Дата = e.date;
                            r1.Серологические_иледования = "серонегативность";
                            r1.ВПГ = e.снвпг;
                            r1.ЦМВ = e.снцмв;
                            r1.Токсопл = "";
                            r1.Хламидии = "";
                            t.Серологические_иследования.Add(r1);
                            ReportScrin r2 = new ReportScrin();
                            r2.Дата = e.date;
                            r2.Возрост = s;
                            r2.Серологические_иледования = "высокий титр антител IgG";
                            r2.ВПГ = e.IgGвпг;
                            r2.ЦМВ = e.IgGцмв;
                            r2.Токсопл = e.IgGт;
                            r2.Хламидии = "";
                            t.Серологические_иследования.Add(r2);
                            ReportScrin r3 = new ReportScrin();
                            r3.Дата = e.date;
                            r3.Возрост = s;
                            r3.Серологические_иледования = "серопозитивность";
                            r3.ВПГ = "";
                            r3.ЦМВ = "";
                            r3.Токсопл = "";
                            r3.Хламидии = e.спх;
                            t.Серологические_иследования.Add(r3);
                            ReportScrin r4 = new ReportScrin();
                            r4.Дата = e.date;
                            r4.Возрост = s;
                            r4.Серологические_иледования = "IgM";
                            r4.ВПГ = e.IgMвпг;
                            r4.ЦМВ = e.IgGцмв;
                            r4.Токсопл = e.IgMт;
                            r4.Хламидии = e.IgMх;
                            t.Серологические_иследования.Add(r4);
                            ReportScrin r5 = new ReportScrin();
                            r5.Дата = e.date;
                            r5.Возрост = s;
                            r5.Серологические_иледования = "низкоавидные антитела";
                            r5.ВПГ = e.НААвпг;
                            r5.ЦМВ = e.НААцмв;
                            r5.Токсопл = e.НААт;
                            r5.Хламидии = e.НААх;
                            t.Серологические_иследования.Add(r5);

                        }
                    }
                    if (p.Labis.pcr != null)
                    {
                        t.ПЦР = new List<pcrreport>();
                        foreach (PCR e in p.Labis.pcr)
                        {
                            pcrreport u1 = new pcrreport();
                            pcrreport u2 = new pcrreport();
                            pcrreport u3 = new pcrreport();
                            pcrreport u4 = new pcrreport();
                            u1.Дата = e.Дата;
                            u1.ПЦР = "ВПГ";
                            u1.Среда = e.ВпгСреда;
                            u1.Рузультат = e.ВпгРез;
                            t.ПЦР.Add(u1);
                            u2.Дата = e.Дата;
                            u2.ПЦР = "ЦМВ";
                            u2.Среда = e.ЦмвСреда;
                            u2.Рузультат = e.ЦмвРез;
                            t.ПЦР.Add(u2);
                            u3.Дата = e.Дата;
                            u3.ПЦР = "хламидии";
                            u3.Среда = e.ХламидииСреда;
                            u3.Рузультат = e.ХламидииРез;
                            t.ПЦР.Add(u3);
                            u4.Дата = e.Дата;
                            u4.ПЦР = "токсоплазма";
                            u4.Среда = e.ТоксоплазмаСреда;
                            u4.Рузультат = e.ТоксоплазмаРез;
                            t.ПЦР.Add(u4);

                        }
                    }
                }
                t.Физическое_развитие = new List<RVReport>();
                if (p.Fiz != null)
                    foreach (Fizcs f in p.Fiz)
                    {
                        RVReport t1 = new RVReport();
                        t1.Месяц = Convert.ToSingle(f.Месяц) + "месяц";
                        t1.Масса_фактическая = f.Масса;
                        t1.Рост_фактический = f.Рост;
                        if ((f.Месяц < 13) & (f.Месяц > 0))
                        {
                            if ((p.Growth <= 1500) & (p.Growth > 1000))
                            {
                                t1.Масса_долженствующая = p.Growth + main.lAV[f.Месяц - 1].От_1001_до_1500;
                                t1.Рост_долженствующий = p.Weight + main.lAR[f.Месяц - 1].От_1001_до_1500 / 10;
                            }
                            if ((p.Growth <= 2000) & (p.Growth > 1500))
                            {
                                t1.Масса_долженствующая = p.Growth + main.lAV[f.Месяц - 1].От_1501_до_2000;
                                t1.Рост_долженствующий = p.Weight + main.lAR[f.Месяц - 1].От_1501_до_2000 / 10;
                            }
                            if ((p.Growth <= 2500) & (p.Growth > 2000))
                            {
                                t1.Масса_долженствующая = p.Growth + main.lAV[f.Месяц - 1].От_2001_до_2500;
                                t1.Рост_долженствующий = p.Weight + main.lAR[f.Месяц - 1].От_2001_до_2500 / 10;
                            }
                            if ((p.Growth <= 1000) & (p.Growth > 800))
                            {
                                t1.Масса_долженствующая = p.Growth + main.lAV[f.Месяц - 1].От_800_до_1000;
                                t1.Рост_долженствующий = p.Weight + main.lAR[f.Месяц - 1].От_800_до_1000 / 10;
                            }
                            if ((p.Growth > 2500))
                            {
                                t1.Масса_долженствующая = p.Growth + main.lAV[f.Месяц - 1].Доношеные;
                                t1.Рост_долженствующий = p.Weight + main.lAR[f.Месяц - 1].Доношеные / 10;
                            }


                        }
                        if ((f.Месяц > 12) & (f.Месяц <= 120))
                        {
                            t1.Масса_долженствующая = 10 * 2 * (f.Месяц / 12);
                        }
                        if ((f.Месяц > 12) & (f.Месяц <= 48))
                        {
                            t1.Рост_долженствующий = 100 - 8 * (4 - (f.Месяц / 12));
                        }
                        if ((f.Месяц > 48))
                        {
                            t1.Рост_долженствующий = 100 + 6 * (4 - (f.Месяц / 12));
                        }
                        if ((t1.Масса_долженствующая != 0) | (t1.Рост_долженствующий != 0))
                        {
                            if (Math.Abs(t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) <= 0.1)
                            {
                                t1.Результат += "эйтрофия; ";
                            }
                            if (((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) > 0.1) & ((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) <= 0.2))
                            {
                                t1.Результат += "гипотрофия 1 степени; ";
                            }
                            if (((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) > 0.2) & ((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) <= 0.3))
                            {
                                t1.Результат += "гипотрофия 2 степени; ";
                            }
                            if (((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 3.0) > 0.3))
                            {
                                t1.Результат += "гипотрофия 3 степени; ";
                            }
                            if (((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) < -0.1) & ((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) >= -0.2))
                            {
                                t1.Результат += "паратрофия 1 степени; ";
                            }
                            if (((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) < -0.2) & ((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) >= -0.3))
                            {
                                t1.Результат += "паратрофия 2 степени; ";
                            }
                            if (((t1.Масса_долженствующая - t1.Масса_фактическая) / (t1.Масса_долженствующая * 1.0) < -0.3))
                            {
                                t1.Результат += "паратрофия 3 степени; ";
                            }
                            if (Math.Abs(t1.Рост_долженствующий - t1.Рост_фактический) / (t1.Рост_долженствующий * 1.0) <= 0.1)
                            {
                                t1.Результат += "мезосомия; ";
                            }
                            if (((t1.Рост_долженствующий - t1.Рост_фактический) / (t1.Рост_долженствующий * 1.0) > 0.1))
                            {
                                t1.Результат += "микросомия; ";
                            }
                            if (((t1.Рост_долженствующий - t1.Рост_фактический) / (t1.Рост_долженствующий * 1.0) < -0.1))
                            {
                                t1.Результат += "макросомия; ";
                            }

                        }
                        t.Физическое_развитие.Add(t1);
                    }
                if (p.Rez != null)
                {
                    t.Резистентность = new List<rezistreport>();


                    foreach (Rez f in p.Rez)
                    {
                        rezistreport t1 = new rezistreport();
                        t1.Количество_ОИЗ = f.Заболеваний;
                        t1.Количество_месяцев = f.Месяц;
                        t1.Аллергия = f.Аллергический_синдром;

                        float t2 = f.Заболеваний;
                        t1.IОЗ = t2 / f.Месяц;
                        if (t1.IОЗ <= 0.32)
                            t1.Заключение = "хорошая резистентность";
                        if ((t1.IОЗ <= 0.49) & (t1.IОЗ > 0.33))
                            t1.Заключение = "сниженная  резистентность";
                        if ((t1.IОЗ <= 0.66) & (t1.IОЗ > 0.5))
                            t1.Заключение = "низкая  резистентность";
                        if ((t1.IОЗ > 0.66))
                            t1.Заключение = "очень низкая  резистентность";
                        t.Резистентность.Add(t1);

                    }
                }
                if (p.Gr != null)
                {
                    t.Группа_здоровья = new List<groupzdreport>();
                    foreach (Group f in p.Gr)
                    {
                        groupzdreport t1 = new groupzdreport();
                        t1.Месяц = f.Месяц;
                        t1.Группа_здоровья = f.Группа_здоровья;
                        t1.Результат = f.Hезультат_наблюдения;
                        t.Группа_здоровья.Add(t1);

                    }
                }

                g.Add(t);
            }
            this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet2", g));
            XmlSerializer xml;
            FileStream stream;
            xml = new XmlSerializer(typeof(List<Global>));
            stream = new FileStream("P.xml", FileMode.Create, FileAccess.ReadWrite);
            xml.Serialize(stream, g);
            
            stream.Close();
        }

        private void grf_Load(object sender, EventArgs e)
        {

            this.reportViewer1.RefreshReport();
        }

        private void reportViewer1_Load(object sender, EventArgs e)
        {

        }
    }
}
